package com.lgc.javathread.signalTest.semaphoreTest;

import java.util.concurrent.Semaphore;

/**
 * Semaphore [ˈseməfɔː(r)]
 * Semaphore 信号量，Semaphore可以控同时访问的线程个数，
 * 通过 acquire() 获取一个许可，如果没有就等待，而 release() 释放一个许可。
 * Semaphore其实和锁有点类似，它一般用于控制对某组资源的访问权限。
 */
public class SemaphoreTest {
    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(3);//参数permits表示许可数目，即同时可以允许多少线程进行访问

        for(int i=0;i<10;i++){
            new Thread(new Worker(semaphore,i)).start();
        }
    }

    static class Worker implements Runnable{
        Semaphore semaphore;
        int num;

        public Worker(Semaphore semaphore,int num){
            this.semaphore = semaphore;
            this.num = num;
        }

        @Override
        public void run() {
            try {
                semaphore.acquire();
                System.out.println(System.currentTimeMillis()+" 工人 "+this.num+" 占用一个机器在生产...");
                Thread.sleep(2000);
                System.out.println(System.currentTimeMillis()+" 工人 "+this.num+" 释放出机器");
                semaphore.release();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
